// 模板：数据类型参数化
//模板的好处： 减少代码的重复编写

#include<iostream>

template <typename T>
T add(T a,T b)
{
    return a + b;
}

struct Student
{
    Student(std::string name,int money):name(name),money(money){}
    int money;
    std::string name;

    void show()
    {
        std::cout<<name<<" ";
        std::cout<<money<<std::endl;
    }

};



//不存在完全通用的代码



//模板函数的特化
//特殊的类型有特殊的处理方式，写了特化版本，编译器不会再为其生成对应类型的模板函数


template <typename S>
void Swap(S &a, S& b)
{
    S temp = a;
    a = b;
    b = temp;
}


template<>
void Swap<Student>(Student& a,Student& b)
{
    int money = a.money;
    a.money = b.money;
    b.money = money;
}








//模板的显式调用
// int main()
// {
//     // int c = add<int>(1,2);

//     // std::cout<< c <<std::endl;
//     // std::cout<<add(1.2,2.2)<<std::endl;//模板的隐式调用

//     // std::cout<<add<std::string>("hello","world")<<std::endl;
//     // return 0;

//     Student a("zhangsan",100);
//     Student b("lisi",200);
//     Swap<Student>(a,b);
    
//     a.show();
//     b.show();
// }







